package java学习.第07章_面向对象编程_进阶;

import java学习.第02章_变量与运算符.B_变量与运算符;

/**
 * ClassName: F_向下转型
 * Package: java学习.第07章_面向对象编程_进阶
 * Description:
 *
 * @Author 张蛟龙
 * @Create 2023/3/8 18:03
 * @Version 1.0
 */
public class F_向下转型 {
    /**
     * 多态是编译时行为还是执行时行为？
     *    执行时行为！
     *
     */
    public static void main(String[] args) {
//        强转_向下转型();

        A b = new B();
        A c = new C();
//        C c1 =(C)b;//类型转换异常
        //不是此类型，不可以转 java.lang.ClassCastException
        //可以判断次对象是不是此类对象或者是此类对象的子类
        System.out.println(b instanceof A);//true
        System.out.println(b instanceof B);//true
        System.out.println(b instanceof C);//false

        //JDK 17  新特性 可以直接 instanceof 类 可以直接用变量自动强转
        if(b instanceof B b1){
             b1.bb();
        }

        //JDK 8  应该是用的
        if(b instanceof B){
            ((B) b).bb();
        }

        //系统自动判断了 b和String没任何关系，直接就不让你使用
//        if(b instanceof String){
//            ((B) b).bb();
//        }


    }

    /**
     *  向下转型后（强转）就能调用了,转型后，属性的默认值也会改变
     *  其实两个属性都进行了存储，在未强转前调用的是声明( = 号前面的)的属性
     *  而强转后，调用的也是声明( = 号前面的) 的属性，但是声明的已经改成了子类
     *  所以调用的是子类的属性
     */
    private static void 强转_向下转型() {
        A b = new B();
        b.a();//只能调用父类有的方法
        b.i = 5;
        System.out.println(b.i);//5
        B b1 = (B)b;
        b1.bb();
        System.out.println(b1.i);//1
        A b2 = b1;//再转回来 就又回到五了
        System.out.println(b2.i);//5
    }
}
class A{
    Integer i = 0;
    public void a(){
        System.out.println("父类");
    }
}
class B extends A {
    Integer i = 1;
    public void a(){
        System.out.println("子类");
    }
    public void bb(){
        System.out.println("子类");
    }
}
class C extends A {

    public void a(){
        System.out.println("子类");
    }
    public void cc(){
        System.out.println("子类");
    }
}

